﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using PandemiaAdmin.Entidades;
using PandemiaAdmin.Funcionalidad;

namespace PandemiaAdminNet.Conexiones
{
    public partial class FrmServidores : Form
    {
        private List<Servidor> _servidores;

        public FrmServidores()
        {
            InitializeComponent();
            _servidores = new List<Servidor>();
        }


        public Servidor ServidorSeleccionado
        {
            get
            {
                Servidor servidor = null;

                if (dgvServidores.SelectedRows.Count > 0)
                {
                    int idServidor = (int)dgvServidores.SelectedRows[0].Cells["ClmIdServidor"].Value;
                    servidor = _servidores.Where(s => s.IdServidor == idServidor).FirstOrDefault();
                }

                return servidor;
            }
        }


        private void FrmServidores_Load(object sender, EventArgs e)
        {
            TraerServidores();
        }

        #region ABM

        private void TraerServidores()
        {
            BLLServidor bll = new BLLServidor(Utilidades.ArchivoServidores);
            _servidores = bll.TraerServidores();
            dgvServidores.DataSource = _servidores.ToList();
        }


        private void btnBuscarServidores_Click(object sender, EventArgs e)
        {
            if (txtBuscarNombre.TextLength == 0)
                TraerServidores();
            else
            {
                dgvServidores.DataSource = (from s in _servidores
                                            where s.Nombre.ToLower().Contains(txtBuscarNombre.Text)
                                            select new
                                            {
                                                IdServidor = s.IdServidor,
                                                Nombre = s.Nombre,
                                                Url = s.SoporteURL,
                                                UltimaConexion = s.UltimaConexion.ToString()
                                            }).ToList();
            }
        }

        private void btnAgregarServidor_Click(object sender, EventArgs e)
        {
            Servidor nuevoServidor = new Servidor();
            FrmServidor frmServidor = new FrmServidor(nuevoServidor);
            BLLServidor bll = new BLLServidor(Utilidades.ArchivoServidores);

            frmServidor.Text = "Nuevo servidor";
            frmServidor.StartPosition = FormStartPosition.CenterScreen;

            if (frmServidor.ShowDialog() == DialogResult.OK)
            {
                bll.CargarServidor(nuevoServidor);
                TraerServidores();
            }
        }

        private void btnEditarServidor_Click(object sender, EventArgs e)
        {
            Servidor seleccionado = ServidorSeleccionado;
            FrmServidor frmServidor = new FrmServidor(seleccionado);

            frmServidor.Text = "Modificando " + seleccionado.Nombre;
            frmServidor.StartPosition = FormStartPosition.CenterScreen;

            if (frmServidor.ShowDialog() == DialogResult.OK)
            {
                BLLServidor bll = new BLLServidor(Utilidades.ArchivoServidores);
                bll.ModificarServidor(seleccionado);
                TraerServidores();
            }
        }

        private void btnEliminarServidor_Click(object sender, EventArgs e)
        {
            Servidor seleccionado = ServidorSeleccionado;

            if (MessageBox.Show("¿Eliminar " + seleccionado.Nombre + "?", "Pregunta", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                BLLServidor bll = new BLLServidor(Utilidades.ArchivoServidores);
                bll.EliminarServidor(seleccionado);
                TraerServidores();
            }
        }

        private void dgvServidores_SelectionChanged(object sender, EventArgs e)
        {
            btnEditarServidor.Enabled = btnEliminarServidor.Enabled = dgvServidores.SelectedRows.Count > 0;
        }

        #endregion

        #region Conectividad

        private void btnChequearOnline_Click(object sender, EventArgs e)
        {
            btnAgregarServidor.Enabled = btnEditarServidor.Enabled = btnEliminarServidor.Enabled = btnChequearOnline.Enabled = false;
            pbEstadoChequeo.Value = 0;
            bgwChequearOnline.RunWorkerAsync();
        }

        private void bgwChequearOnline_DoWork(object sender, DoWorkEventArgs e)
        {
            int procesados = 0;
            int total = dgvServidores.Rows.Count;

            foreach (DataGridViewRow fila in dgvServidores.Rows)
            {
                if (bgwChequearOnline.CancellationPending)
                    break;

                int idServidor = (int)fila.Cells["ClmIdServidor"].Value;
                Servidor servidor = _servidores.Where(s => s.IdServidor == idServidor).FirstOrDefault();
                AdminServidor admin = new AdminServidor();

                procesados++;
                int progreso = procesados * 100 / total;

                KeyValuePair<int, bool> value = new KeyValuePair<int, bool>(fila.Index, admin.ChequearServidor(servidor));
                bgwChequearOnline.ReportProgress(progreso, value);
            }
            
        }

        private void bgwChequearOnline_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            KeyValuePair<int, bool> value = (KeyValuePair<int, bool>)e.UserState;
            pbEstadoChequeo.Value = e.ProgressPercentage;
            dgvServidores.Rows[value.Key].DefaultCellStyle.BackColor = (value.Value) ? Color.Green : Color.Red;
            dgvServidores.Rows[value.Key].DefaultCellStyle.ForeColor = Color.White;
            dgvServidores.Rows[value.Key].DefaultCellStyle.SelectionForeColor = (value.Value) ? Color.Green : Color.Red;
        }

        private void bgwChequearOnline_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error != null)
                MessageBox.Show(e.Error.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);

            btnAgregarServidor.Enabled = btnEditarServidor.Enabled = btnEliminarServidor.Enabled = btnChequearOnline.Enabled = true;
        }

        #endregion
    }
}
